qt 设置焦点 跳到下个控件

您所在的位置:网站首页 qt 虚拟键盘配置 qt 设置焦点 跳到下个控件

qt 设置焦点 跳到下个控件

2023-11-30 11:04| 来源: 网络整理| 查看: 265

背景:

个人在开发项目的时候,由于是在 arm 上进行开发的,但是由于性能的限制,只能使用 QWidget 进行开发,而无法使用 qml 中的虚拟键盘,由于寻找无果,因此决定自己动手写一个还算可以的虚拟键盘。

功能简介:

这是一个使用 QWidget 开发的 qt 虚拟键盘,功能包括:

支持词组输入,例如 nihao —> 你好支持自动弹出: 当焦点改变后自动弹出键盘支持部分控件不响应:通过设置动态属性,实现部分控件不弹出键盘使用 QWidget,理论上支持全部 qt 版本使用 sqlite3,只要懂得一些数据库操作,即可简易地明白代码

演示动画:

如动态图所见,支持自动弹出,支持词组输出,样式跟 google 键盘类似

9af551dfa0ae7178bf3928654a02513c.gif

了解该程序的重要函数:

//virtualkeyboard.h virtualkeyboard.cpp 比较重要的几个函数: getChineseListMap //获取汉字词组 focusChangedSlot //自动弹出键盘,以及键盘响应的类型 InsertTextToCurFocusWt //向输入控件插入文本 DeleteTextFromCurFocusWt //向输入控件删除一个字符

这个是我整个测试程序的工程结构,十分简洁:

. ├── main.cpp ├── readme.txt ├── Resource ├── virtualkeyboard.cpp ├── virtualkeyboard.h ├── virtualkeyboard.pri ├── virtualKeyBoard.pro ├── virtualKeyBoard.pro.user └── virtualkeyboard.ui 1 directory, 8 files

如何使用:

//以前写过一个需要自定义 le 和 btn 现在不需要了,这个不会导致光标消失,而且使用起来更加方便。 //不过目前还是使用的 sqlite3 来查找词组的,之前看过 google PY 的,不过不是很有心去弄,还望各 //位赐教 //main.cpp #include #include "virtualkeyboard_hasQSQLITE/virtualkeyboard.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); auto keyboard = VirtualKeyBoard::getKeyboard(); keyboard->setGeometry(300, 200, 432, 185); keyboard->init("virtualkeyboard_hasQSQLITE/Resource/ChinesePY.db"); auto le = new QLineEdit(nullptr); le->setGeometry(100, 0, 100,50); le->show(); le = new QLineEdit(nullptr); le->setGeometry(100, 200, 100,50); keyboard->show(); le->show(); return a.exec(); }

部分源码示例:

控制键盘自动弹起的重要函数,头文件有注释说明

void VirtualKeyBoard::focusChangedSlot(QWidget *old, QWidget *now) { Q_UNUSED(old) if (nullptr != now && !this->isAncestorOf(now)) { if (now->inherits("QWidget")) { QStringList accept_wts; accept_wts //该控件是否响应键盘, //setProperty("haveInput", false);表示该控件不响应键盘 if (now->property("haveInput").isNull() || now->property("haveInput").toBool()) { cur_focus_wt_ = now; break; } } } if (nullptr != cur_focus_wt_) { this->show(); } } } }

向控件插入文本,使用这种方法的好处就是可以在任意地方键入文本,而且光标不会消失

#include void VirtualKeyBoard::InsertTextToCurFocusWt(const QString &str) { if (nullptr != cur_focus_wt_) { QKeyEvent keyPress(QEvent::KeyPress, 0, Qt::NoModifier, QString(str)); QApplication::sendEvent(cur_focus_wt_, &keyPress); } }

项目地址:

该项目包含了自己制作汉字数据库的代码,也可以看一下,虽然词组文本已经丢了,但是看下代码然后自己生成就可以了

本项目完全开源,欢迎各位留言评论,点赞,收藏,也可以在项目点个 start 支持一下,有好的建议也欢迎各位积极留言。

https://gitee.com/hehj_2/QtProject​gitee.com

本文由知乎用户"浅心岁去"首发于知乎,转载请注明出处。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3